package com.linkgie.galaxyframework.security.rbac;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.linkgie.galaxyframework.security.SecuredAuthority;

/**
 * 安全权限标注；
 * <p>
 * 
 * 用于将某个方法标注为受安全访问控制的权限；<p>
 * 
 * 注：标注在 private 方法上是不允许的，此时不起任何作用；
 * 
 * @author spring
 *
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Privilege {

	/**
	 * 授权码；
	 * <p>
	 * 
	 * 等同于 {@link SecuredAuthority#getAuthority()} 属性的定义；
	 * <p>
	 * 
	 * 不同的 {@link Privilege} 标注实例可以设置相同的授权码，以实现批量的权限定义和授权，但此时必须要为每一个标注实例设置唯一的编码
	 * {@link #code()} ；
	 * <p>
	 * 
	 * @return
	 */
	String value();

	/**
	 * 命名所标注方法的权限的唯一编码；
	 * <p>
	 * 
	 * 这是可选参数，如果未设置，则取授权码 {@link #value()} 作为此项属性的值；
	 * 
	 * <p>
	 * 
	 * 当对多个 {@link Privilege} 标注实例设置相同的授权码以实现批量的权限定义和授权时，不能忽略此属性，必须为此属性设置全局唯一的值；
	 * 
	 * @return
	 */
	String code() default "";

	/**
	 * 命名所标注方法的权限名称；
	 * 
	 * @return
	 */
	String name() default "";

	/**
	 * 命名所标注方法的权限描述；
	 * 
	 * @return
	 */
	String description() default "";

}
